package com.sxj.corejava.code13_JDBC;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class Test13_dbcp {

    public static void main(String[] args) throws Exception {
        test02();
    }

    public static void test01() throws SQLException {
        BasicDataSource ds = new BasicDataSource();
        // 配置连接数据库的信息
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8");
        ds.setUsername("root");
        ds.setPassword("root");

        // 配置初始化连接数:在初始化连接池时向数据库申请的连接数量
        ds.setInitialSize(1);
        // 最大活跃数:表示最多可以有多少个连接被使用
        ds.setMaxActive(1);
        // 最大空闲连接数:表示连接池中最多存在都少个空闲的连接数
        ds.setMaxIdle(1);
        // 最小空闲连接数:表示连接池中至少存在都少个空闲的连接数
        // 如果不足,则自动申请新的连接
        ds.setMinIdle(1);

        // 设置等待时间,单位:毫秒
        // 表示在获取连接时最大的等待时间,如果超出指定时间,则直接报错
        ds.setMaxWait(3000);

        // 使用
        Connection conn = ds.getConnection();
        System.out.println(conn);
        // 释放连接,释放后的连接会回到连接池中,等待下一个人使用
        conn.close();

        // 当上一个人获取连接后没有释放时,第二个人获取连接需要等待
        // 如果连接池中存在连接,则不需要等待,直接获取
        Connection conn2 = ds.getConnection();
        System.out.println(conn2);
    }

    public static void test02() throws Exception {
        Properties p = new Properties();
        p.load(Test13_dbcp.class.getClassLoader().getResourceAsStream("dataSource.properties"));
        System.out.println(p);

        DataSource ds = BasicDataSourceFactory.createDataSource(p);
        Connection conn = ds.getConnection();
        System.out.println(conn);
        conn.close();
        Connection conn2 = ds.getConnection();
        System.out.println(conn2);
    }

}
